package practiceProjects;

/**
 * @Project ：learn_java
 * @File ：DesktopOrganizationDeepseekVersion.java
 * @IDE ：IntelliJ IDEA
 * @Author ：自由如风间
 * @Date ：2025/3/10 19:45
 * @Description ：deepseek提供的文件移动代码
 */

import java.io.*;
import java.nio.file.*;

public class DesktopOrganizationDeepseekVersion {
    public static void main(String[] args) {
        // 更优雅的路径获取方式
        String desktopPath = System.getProperty("user.home") + "\\Desktop";

        // 目标路径数组（可扩展）
        String[] destPaths = {
                System.getProperty("user.home") + "\\Documents\\我的文档",    // 文档类
                System.getProperty("user.home") + "\\Pictures\\嘛嘛嘛都是些什么", // 图片类
                "E:\\DDD\\file\\typora文件"  // Markdown文件
        };

        // 自动创建目标目录
        createDirectories(destPaths);

        File desktop = new File(desktopPath);
        File[] files = desktop.listFiles();

        if (files == null || files.length == 0) {
            System.out.println("桌面空空，不用继续");
            return;
        }

        for (File f : files) {
            if (f.isFile()) {  // 确保处理的是文件
                try {
                    if (f.getName().toLowerCase().endsWith(".txt")) {
                        safeMoveFile(f, destPaths[0]);
                    } else if (isImageFile(f.getName())) {
                        safeMoveFile(f, destPaths[1]);
                    } else if (f.getName().toLowerCase().endsWith(".md")) {
                        safeMoveFile(f, destPaths[2]);
                    }
                } catch (IOException e) {
                    System.err.println("移动文件失败: " + f.getName());
                    e.printStackTrace();
                }
            }
        }
    }

    // 自动创建目标目录
    private static void createDirectories(String[] paths) {
        for (String path : paths) {
            File dir = new File(path);
            if (!dir.exists() && !dir.mkdirs()) {
                System.err.println("无法创建目录: " + path);
            }
        }
    }

    // 判断图片文件（扩展更多格式）
    private static boolean isImageFile(String filename) {
        String[] imgExtensions = {".png", ".jpg", ".jpeg", ".gif"};
        String lowerName = filename.toLowerCase();
        for (String ext : imgExtensions) {
            if (lowerName.endsWith(ext)) return true;
        }
        return false;
    }

    // 安全的文件移动方法
    private static void safeMoveFile(File source, String destDir) throws IOException {
        Path sourcePath = source.toPath();
        Path targetPath = Paths.get(destDir, source.getName());

        // 处理文件名冲突
        int counter = 1;
        while (Files.exists(targetPath)) {
            String newName = String.format("%s(%d)%s",
                    getFileNameWithoutExtension(source.getName()),
                    counter,
                    getFileExtension(source.getName()));
            targetPath = Paths.get(destDir, newName);
            counter++;
        }

        // 原子性移动操作
        Files.move(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING);
        System.out.println("成功移动: " + source.getName() + " → " + targetPath);
    }

    // 获取无扩展名的文件名
    private static String getFileNameWithoutExtension(String filename) {
        int dotIndex = filename.lastIndexOf('.');
        return (dotIndex == -1) ? filename : filename.substring(0, dotIndex);
    }

    // 获取文件扩展名
    private static String getFileExtension(String filename) {
        int dotIndex = filename.lastIndexOf('.');
        return (dotIndex == -1) ? "" : filename.substring(dotIndex);
    }
}